import type { RouteRecordRaw } from 'vue-router'
import router from '@/router'

function loadLocalRoutes() {
  const localRoutes: RouteRecordRaw[] = []
  //1.读取router/main下所有的ts文件
// Vite 特有的 API：用于动态导入文件。
// 作用：根据指定的路径模式，批量导入匹配的文件。
// 返回：一个对象，key 是文件路径，value 是模块内容。
// '@/router/main/**/*.ts'
// 路径模式：使用 glob 语法匹配文件。
// @/：别名，指向 src/ 目录。
// router/main/：具体目录路径。
// **/*.ts：递归匹配所有子目录下的 .ts 文件。
// { eager: true }
// 配置选项：
// eager: true：立即加载所有匹配的文件，而不是懒加载。
// 默认情况下，import.meta.glob() 返回的是懒加载函数，需要调用才会加载。
// Record<string, any>用键值对保存为一个对象
  const files: Record<string, any> = import.meta.glob('@/router/main/**/*.ts', {
    eager: true
  })
  for (const key in files) {
    const module = files[key]
    //获取每个模块的默认导出（module.default）
    // 并将其添加到 localRoutes 数组中
    localRoutes.push(module.default)
  }
  return localRoutes
}
//解决当第一次进入页面时默认页面加载问题，现在是路径还停留在main
export let firstMenu: any = null
export function mapMenusToRoutes(userMenus: any[]): RouteRecordRaw[] {
  const localRoutes = loadLocalRoutes()
  const routes: RouteRecordRaw[] = []
  for (const menu of userMenus) {
    for (const submenu of menu.children) {
      //item当前处理的数组元素
      //在 localRoutes本地数组中查找路径（path）与 submenu.url 相等的路由对象，并将找到的路由对象赋值给 route 变量
      const route = localRoutes.find((item) => item.path === submenu.url)
      if (route) {
        //重定向，规则点击第一个面包屑导航时，定向到第一个有权限的子菜单路由
        //只需要添加一个即可，检查是否包含一级菜单的路由
        if (!routes.find((item) => item.path === menu.url)) {
          routes.push({ path: menu.url, redirect: route.path })
        }
        routes.push(route)
      }
      //记录第一个被匹配到的菜单路径，用于初始化页面时默认显示第一个菜单对应的页面内容
      // 当 firstMenu 为 null 且 route 不为 null 时，将 submenu 赋值给 firstMenu
      if (!firstMenu && route) {
        firstMenu = submenu
      }
    }
  }
  return routes
}
//根据路径去匹配需要添加的路由对象
export function mapPathToMenu(path: string, userMenus: any[]): any {
  for (const menu of userMenus) {
    for (const submenu of menu.children) {
      if (submenu.url === path) {
        return submenu
      }
    }
  }
}
export function mapPathToBreadcrumbs(path: string, userMenus: any[]): any {
  // 创建一个空数组用于存储面包屑导航项
  const breadcrumbs: any[] = []
  // 遍历用户菜单
  for (const menu of userMenus) {
    // 遍历菜单的子项
    for (const submenu of menu.children) {
      // 如果当前路径与子项的url匹配，则将父级和子级都添加到面包屑导航中
      if (submenu.url === path) {
        breadcrumbs.push({ name: menu.name, path: menu.url })
        breadcrumbs.push({ name: submenu.name, path: path })
        return breadcrumbs // 直接返回结果，不再继续查找其他匹配项
      }
    }
  }

  // 返回面包屑导航项数组
  return breadcrumbs
}
/**
 * 菜单映射到id的列表，回显转变数据对象转为数组
 * @param menuList
 */
export function mapMenuListToIds(menuList: any[]) {
  const ids: number[] = []
  // 递归获取最后一级菜单id列表
  function recurseGetId(menus: any[]) {
    for (const item of menus) {
      if (item.children) {
        recurseGetId(item.children)
      } else {
        ids.push(item.id)
      }
    }
  }
  recurseGetId(menuList)
  return ids
}
//映射按钮权限
//store/login/login.ts - loginAccountAction 方法里面调用
// 获取登录用户所有按钮权限

export function mapMenuToPermissions(menuList: any[]) {
  const permissions: string[] = []
  // 递归获取所有按钮权限
  function recurseGetPermission(menus: any[]) {
    for (const item of menus) {
      if (item.type === 3) {// type === 3 表示按钮权限
        permissions.push(item.permission)
      } else {
        recurseGetPermission(item.children ?? [])
      }
    }
  }
  recurseGetPermission(menuList)
  return permissions
}
